/*Nama File : CommandExecutor.h
  Pembuat	: Ni Made Satvika Iswari - 23512077/ Karina Novita Suryani - 23512187 
  tanggal 	: 1 November 2012
  */
  
#ifndef _COMMANDEXECUTOR_H
#define _COMMANDEXECUTOR_H

#include <cstdlib>
#include "../Calendar/Calendar.h"
#include "../CommandProcessor/CommandProcessor.h"
#include "CommandExecutorExp.h"

class CommandExecutor{
	private :
		Calendar curCalendar;					//penyimpan kalender saat ini
		CommandProcessor curCommandProcessor;	//penyimpan daftar command masukan user saat ini
		static int execStatus; //0 : INIT ; 1 : CREATED/LOADED ; 99 : QUIT
		vector<Calendar> arrayUndoCalendar;
		vector<Calendar> arrayRedoCalendar;
		
	public :
		//static int execStatus; //0 : INIT ; 1 : CREATED/LOADED ; 99 : QUIT
		//4 Sekawan
		CommandExecutor(); //ctor
		CommandExecutor(const CommandExecutor& ); //cctor
		~CommandExecutor(); //dtor
		CommandExecutor& operator= (const CommandExecutor&); //operator=
		
		//getter
		CommandProcessor getCurCommandProcessor();
		/* mendapatkan currend command processor */
		Calendar getCurCalendar();
		/*mendapatkan current calender*/
		static int getExecStatus();
		/*mendapatkan current status eksekusi*/
		
		//setter
		void setCurCommandProcessor(CommandProcessor);
		void setCurCalendar(Calendar);
		/*I.S. sembarang */
		/*F.S. curCalender di set dengan inputan */
		
		static void setExecStatus(int);
		/*I.S. sembarang */
		/*F.S. execStatus di set dengan inputan*/
		
		//Operasi pada Calender
		void CreateCal(string);
		/*I.S. sembarang */
		/*F.S. mengosongkan curCalender dan mengeset namanya menjadi nama yang diinputkan */
		
		void DeleteCal(string);
		/*I.S. calender sudah dibuat,sembarang */
		/*F.S. mengosongkan curCalender dan mengeset namanya menjadi ""*/
		
		void SaveCal(string);
		/*I.S. calender sudah dibuat, curCalender mungkin kosong*/
		/*F.S. menyimpan isi curCalender ke dalam file */
		
		void LoadCal(string);
		/*I.S. curCalender mungkin sudah terisi */
		/*F.S. mengosongkan curCalender lalu me-load isi file ke dalam kalender*/
		
		bool IsFileExtValid(string, string);
		/* Parameter extention tidak mengandung titik "." */
		/* Mengembalikan true jika file extention sesuai dengan yang telah ditentukan */
		
		void SortCal(string);
		/*I.S. calender sudah dibuat,curCalendar mungkin kosong*/
		/*F.S. mengurutkan calender berdasarkan tanggal event*/
		
		void AddCalEvent(string,int);
		/*I.S. calender sudah dibuat,sembarang*/
		/*F.S. menambahkan event pada kalender dengan event no dan nama calender yg sesuai*/
		
		void DeleteCalEvent(string,int);
		/*I.S. ccalender sudah dibuat,urCalendar mungkin kosong, event yang ingin dihapus mungkin tidk ada di calender*/
		/*F.S. menghapus event pada calender dengan nama calender dan event no yng sesuai*/
		
		//Operasi pada Command
		void EmptyCommand();
		/*I.S. daftar command mungkin kosong */
		/*F.S. mengosongkan memori yang menyimpan daftar command yang valid yang pernah diinputkan user*/
		
		void SaveCommand(string);
		/*I.S. daftar command mungkin kosong */
		/*F.S. menyimpan hanya daftar command yang valid yang pernah diinputkan user */
		
		void DisplayCommand();
		/*I.S. daftar referensi valid mungkin kosong */
		/*F.S. menampilkan referensi command valid yang ada pada filename yang diinputkan*/
		
		void UndoCommand(int);
		/*I.S. sembarang */
		/*F.S. mengembalikan curCalender ke state curCalender pada aksi sebelumnya sebanyak n kali */

		void RedoCommand(int);
		/*I.S. telah melakukan undi */
		/*F.S. mengembalikan curCalender ke state curCalender pada sebelum undo sebanyak n kali*/

		//Operasi pada aplikasi
		void Quit();
		/*I.S. sembarang*/
		/*F.S. execStatus = 99 */
		
		//exekusi command
		void Exec(string);
		/*I.S. sembarang */
		/*F.S. memarsing string perintah user, lalu mengeksekusi perintah user*/
		
		
};


#endif
